package com.cougil.uoc.seghismed.business;

import java.util.List;

import com.cougil.uoc.seghismed.model.Metge;
import com.cougil.uoc.seghismed.model.Pacient;
import com.cougil.uoc.seghismed.model.ciphed.HistorialCiphed;
import com.cougil.uoc.seghismed.model.ciphed.MetgeCiphed;
import com.cougil.uoc.seghismed.model.ciphed.PacientCiphed;
import com.cougil.uoc.seghismed.model.ciphed.UsuariCiphed;
import com.cougil.uoc.seghismed.model.ciphed.VisitaCiphed;

/**
 * Interface que defineix els mètodes oferts a les peticions rebudes a través dels diversos
 * aplicatius, tant Metge com Pacient. Entre d'altres disposa de la lògica de negoci comuna a ambdòs
 * aplicacions
 * 
 * @author Ignacio Cougil Jares
 * 
 */
public interface GestorService extends CoreServerService {

	/**
	 * Crea la visita xifrada informada com una nova del pacient del que és responsabilitat el metge
	 * facilitat. Previament ja s'ha comprovat que el pacient ho és del metge informat
	 *
	 * @param metgeCiphed
	 *            {@link MetgeCiphed} metge xifrat que intenta crear la visita
	 * @param pacientCiphed
	 *            {@link PacientCiphed} pacient pel qual es vol crear la visita
	 * @param visitaCiphed
	 *            {@link VisitaCiphed} visita xifrada que es preten crear
	 */
	public void afegirVisita(MetgeCiphed metgeCiphed, PacientCiphed pacientCiphed, VisitaCiphed visitaCiphed);

	/**
	 * Retorna l'historial del pacient informat xifrat només per l'usuari indicat
	 *
	 * @param pacientCiphed
	 *            {@link PacientCiphed} pacient xifrat del qual es vol obtenir el seu historial
	 * @param usuariCiphed
	 *            {@link UsuariCiphed} usuari xifrat pel qual es vol xifrar l'historial
	 * @return historial {@link HistorialCiphed} xifrat
	 */
	public HistorialCiphed consultarHistorial(PacientCiphed pacientCiphed, UsuariCiphed usuariCiphed);

	/**
	 * Retorna el pacient xifrat informat, amb totes les seves dades informades per al metge
	 * informat, sempre que aquest últim tingui permís per a accedir-hi
	 *
	 * @param metgeCiphed
	 *            {@link MetgeCiphed} metge xifrat per al qual es vol xifrar la informació del
	 *            pacient
	 * @param pacientCiphed
	 *            {@link PacientCiphed} pacient xifrat del que es vol consultar la informació
	 * @return Pacient carregat i xifat {@link PacientCiphed} per al metge xifrat informat o null en
	 *         cas que l'usuari no tingui accés (no sigui un dels pacients associats al metge) o no
	 *         es pugui trobar
	 */
	public PacientCiphed consultarPacient(MetgeCiphed metgeCiphed, PacientCiphed pacientCiphed);

	/**
	 * Retorna el conjunt de pacients xifrats i associats només pel metge indicat
	 *
	 * @param metgeCiphed
	 *            {@link MetgeCiphed} metge xifrat del qual es vol obtenir el seu conjunt de pacients associats
	 * @return llista {@link List} amb el conjunt de pacients associats
	 */
	public List<PacientCiphed> consultarPacients(MetgeCiphed metgeCiphed);

	/**
	 * Retorna les dades carregades de la visita xifrada del pacient informat només per l'usuari
	 * facilitat. Cerca les dades disponibles per la visita informada d'entre les associades al
	 * pacient
	 *
	 * @param usuariCiphed
	 *            {@link UsuariCiphed} usuari pel qual es preten xifrar la informació de la visita
	 * @param pacientCiphed
	 *            {@link PacientCiphed} pacient que indica que la visita és seva
	 * @param visitaCiphed
	 *            {@link VisitaCiphed} visita xifrada de la que es preten obtenir tota la informació
	 * @return Visita xifrada associada o null en cas que no s'hagi trobat
	 */
	public VisitaCiphed consultarVisita(UsuariCiphed usuariCiphed, PacientCiphed pacientCiphed,
			VisitaCiphed visitaCiphed);

	/**
	 * Elimina un metge i totes les seves dades associades
	 *
	 * @param metge
	 *            {@link Metge} a eliminar
	 */
	public void eliminarMetge(Metge metge);

	/**
	 * Elimina un pacient i totes les seves dades associades
	 *
	 * @param pacient
	 *            {@link Pacient} a eliminar
	 */
	public void eliminarPacient(Pacient pacient);

	/**
	 * Crea o actualitza un metge amb totes les seves dades associades
	 *
	 * @param metge
	 *            {@link Metge} a emmagatzemar
	 * @return el mateix objecte actualitzat
	 */
	public Metge guardarMetge(Metge metge);

	/**
	 * Crea o actualitza un pacient amb totes les seves dades associades
	 *
	 * @param pacient
	 *            {@link Pacient} a emmagatzemar
	 * @return el mateix objecte actualitzat
	 */
	public Pacient guardarPacient(Pacient pacient);


}






